bitkeeper revision 1.1159.69.16 (413aa1d0GpVAPcEe9OlMHIT6xiUM_w)
authorkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Sun, 5 Sep 2004 05:19:12 +0000 (05:19 +0000)
committerkaf24@freefall.cl.cam.ac.uk <kaf24@freefall.cl.cam.ac.uk>
Sun, 5 Sep 2004 05:19:12 +0000 (05:19 +0000)
Patch AGP and DRM video drivers to be (hopefully) safe for Xen.
These patches must be applied manually for now:
 cd linux-2.6.8.1-xen0 ; patch -p1 <../linux-2.6.8.1-patches/*.patch

.rootkeys
linux-2.6.8.1-patches/agpgart.patch [new file with mode: 0644]
linux-2.6.8.1-patches/drm.patch [new file with mode: 0644]

index 2d8b4d0fcb1b67236c7febbc80c490157e43be68..78e1b4f5ca252d52a71ee76ea6ace0fbece54e8f 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 409ba2e7akOFqQUg6Qyg2s28xcXiMg linux-2.4.27-xen-sparse/mm/page_alloc.c
 3e5a4e683HKVU-sxtagrDasRB8eBVw linux-2.4.27-xen-sparse/mm/swapfile.c
 41180721bNns9Na7w1nJ0ZVt8bhUNA linux-2.4.27-xen-sparse/mm/vmalloc.c
+413aa1d0oNP8HXLvfPuMe6cSroUfSA linux-2.6.8.1-patches/agpgart.patch
+413aa1d0ewvSv-ohnNnQQNGsbPTTNA linux-2.6.8.1-patches/drm.patch
 40f562372u3A7_kfbYYixPHJJxYUxA linux-2.6.8.1-xen-sparse/arch/xen/Kconfig
 40f56237utH41NPukqHksuNf29IC9A linux-2.6.8.1-xen-sparse/arch/xen/Kconfig.drivers
 40f56237penAAlWVBVDpeQZNFIg8CA linux-2.6.8.1-xen-sparse/arch/xen/Makefile
diff --git a/linux-2.6.8.1-patches/agpgart.patch b/linux-2.6.8.1-patches/agpgart.patch
new file mode 100644 (file)
index 0000000..f5d2ad9
--- /dev/null
@@ -0,0 +1,328 @@
+--- linux-2.6.8.1/drivers/char/agp/ali-agp.c   2004-08-14 11:55:35.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/ali-agp.c      2004-09-05 05:55:58.876495340 +0100
+@@ -150,7 +150,7 @@
+       pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp);
+       pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL,
+                       (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
+-                        virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN ));
++                        virt_to_bus(addr)) | ALI_CACHE_FLUSH_EN ));
+       return addr;
+ }
+@@ -174,7 +174,7 @@
+       pci_read_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL, &temp);
+       pci_write_config_dword(agp_bridge->dev, ALI_CACHE_FLUSH_CTRL,
+                       (((temp & ALI_CACHE_FLUSH_ADDR_MASK) |
+-                        virt_to_phys(addr)) | ALI_CACHE_FLUSH_EN));
++                        virt_to_bus(addr)) | ALI_CACHE_FLUSH_EN));
+       agp_generic_destroy_page(addr);
+ }
+--- linux-2.6.8.1/drivers/char/agp/amd-k7-agp.c        2004-08-14 11:56:24.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/amd-k7-agp.c   2004-09-05 05:55:58.877495108 +0100
+@@ -43,7 +43,7 @@
+       SetPageReserved(virt_to_page(page_map->real));
+       global_cache_flush();
+-      page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
++      page_map->remapped = ioremap_nocache(virt_to_bus(page_map->real),
+                                           PAGE_SIZE);
+       if (page_map->remapped == NULL) {
+               ClearPageReserved(virt_to_page(page_map->real));
+@@ -152,7 +152,7 @@
+       agp_bridge->gatt_table_real = (u32 *)page_dir.real;
+       agp_bridge->gatt_table = (u32 *)page_dir.remapped;
+-      agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real);
++      agp_bridge->gatt_bus_addr = virt_to_bus(page_dir.real);
+       /* Get the address for the gart region.
+        * This is a bus address even on the alpha, b/c its
+@@ -166,7 +166,7 @@
+       /* Calculate the agp offset */
+       for (i = 0; i < value->num_entries / 1024; i++, addr += 0x00400000) {
+               page_dir.remapped[GET_PAGE_DIR_OFF(addr)] =
+-                      virt_to_phys(amd_irongate_private.gatt_pages[i]->real);
++                      virt_to_bus(amd_irongate_private.gatt_pages[i]->real);
+               page_dir.remapped[GET_PAGE_DIR_OFF(addr)] |= 0x00000001;
+       }
+--- linux-2.6.8.1/drivers/char/agp/amd64-agp.c 2004-08-14 11:55:47.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/amd64-agp.c    2004-09-05 05:55:58.877495108 +0100
+@@ -212,7 +212,7 @@
+ static int amd_8151_configure(void)
+ {
+-      unsigned long gatt_bus = virt_to_phys(agp_bridge->gatt_table_real);
++      unsigned long gatt_bus = virt_to_bus(agp_bridge->gatt_table_real);
+       /* Configure AGP regs in each x86-64 host bridge. */
+       for_each_nb() {
+@@ -521,7 +521,7 @@
+ {
+       struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
+-      release_mem_region(virt_to_phys(bridge->gatt_table_real),
++      release_mem_region(virt_to_bus(bridge->gatt_table_real),
+                          amd64_aperture_sizes[bridge->aperture_size_idx].size);
+       agp_remove_bridge(bridge);
+       agp_put_bridge(bridge);
+--- linux-2.6.8.1/drivers/char/agp/ati-agp.c   2004-08-14 11:55:48.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/ati-agp.c      2004-09-05 05:55:58.877495108 +0100
+@@ -64,7 +64,7 @@
+       /* CACHE_FLUSH(); */
+       global_cache_flush();
+-      page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real),
++      page_map->remapped = ioremap_nocache(virt_to_bus(page_map->real),
+                                           PAGE_SIZE);
+       if (page_map->remapped == NULL || err) {
+               ClearPageReserved(virt_to_page(page_map->real));
+--- linux-2.6.8.1/drivers/char/agp/backend.c   2004-08-14 11:55:47.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/backend.c      2004-09-05 05:55:58.878494876 +0100
+@@ -142,7 +142,7 @@
+                       return -ENOMEM;
+               }
+-              bridge->scratch_page_real = virt_to_phys(addr);
++              bridge->scratch_page_real = virt_to_bus(addr);
+               bridge->scratch_page =
+                   bridge->driver->mask_memory(bridge->scratch_page_real, 0);
+       }
+@@ -186,7 +186,7 @@
+ err_out:
+       if (bridge->driver->needs_scratch_page)
+               bridge->driver->agp_destroy_page(
+-                              phys_to_virt(bridge->scratch_page_real));
++                              bus_to_virt(bridge->scratch_page_real));
+       if (got_gatt)
+               bridge->driver->free_gatt_table();
+       if (got_keylist) {
+@@ -211,7 +211,7 @@
+       if (bridge->driver->agp_destroy_page &&
+           bridge->driver->needs_scratch_page)
+               bridge->driver->agp_destroy_page(
+-                              phys_to_virt(bridge->scratch_page_real));
++                              bus_to_virt(bridge->scratch_page_real));
+ }
+ static const drm_agp_t drm_agp = {
+--- linux-2.6.8.1/drivers/char/agp/generic.c   2004-08-14 11:55:10.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/generic.c      2004-09-05 05:55:58.879494644 +0100
+@@ -127,7 +127,7 @@
+       }
+       if (curr->page_count != 0) {
+               for (i = 0; i < curr->page_count; i++) {
+-                      agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[i]));
++                      agp_bridge->driver->agp_destroy_page(bus_to_virt(curr->memory[i]));
+               }
+       }
+       agp_free_key(curr->key);
+@@ -181,7 +181,7 @@
+                       return NULL;
+               }
+               new->memory[i] =
+-                      agp_bridge->driver->mask_memory(virt_to_phys(addr), type);
++                      agp_bridge->driver->mask_memory(virt_to_bus(addr), type);
+               new->page_count++;
+       }
+@@ -636,6 +636,7 @@
+       int i;
+       void *temp;
+       struct page *page;
++      dma_addr_t dma;
+       /* The generic routines can't handle 2 level gatt's */
+       if (agp_bridge->driver->size_type == LVL2_APER_SIZE)
+@@ -674,8 +675,10 @@
+                               break;
+                       }
+-                      table = (char *) __get_free_pages(GFP_KERNEL,
+-                                                        page_order);
++                      table = dma_alloc_coherent(
++                                      &agp_bridge->dev->dev,
++                                      PAGE_SIZE << page_order, &dma,
++                                      GFP_KERNEL);
+                       if (table == NULL) {
+                               i++;
+@@ -706,7 +709,9 @@
+               size = ((struct aper_size_info_fixed *) temp)->size;
+               page_order = ((struct aper_size_info_fixed *) temp)->page_order;
+               num_entries = ((struct aper_size_info_fixed *) temp)->num_entries;
+-              table = (char *) __get_free_pages(GFP_KERNEL, page_order);
++              table = dma_alloc_coherent(
++                              &agp_bridge->dev->dev,
++                              PAGE_SIZE << page_order, &dma, GFP_KERNEL);
+       }
+       if (table == NULL)
+@@ -721,7 +726,7 @@
+       agp_gatt_table = (void *)table;
+       agp_bridge->driver->cache_flush();
+-      agp_bridge->gatt_table = ioremap_nocache(virt_to_phys(table),
++      agp_bridge->gatt_table = ioremap_nocache(virt_to_bus(table),
+                                       (PAGE_SIZE * (1 << page_order)));
+       agp_bridge->driver->cache_flush();
+@@ -729,11 +734,12 @@
+               for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
+                       ClearPageReserved(page);
+-              free_pages((unsigned long) table, page_order);
++              dma_free_coherent(&agp_bridge->dev->dev, PAGE_SIZE<<page_order,
++                                      table, dma);
+               return -ENOMEM;
+       }
+-      agp_bridge->gatt_bus_addr = virt_to_phys(agp_bridge->gatt_table_real);
++      agp_bridge->gatt_bus_addr = virt_to_bus(table);
+       /* AK: bogus, should encode addresses > 4GB */
+       for (i = 0; i < num_entries; i++)
+@@ -785,7 +791,8 @@
+       for (page = virt_to_page(table); page <= virt_to_page(table_end); page++)
+               ClearPageReserved(page);
+-      free_pages((unsigned long) agp_bridge->gatt_table_real, page_order);
++      dma_free_coherent(&agp_bridge->dev->dev, PAGE_SIZE<<page_order,
++              agp_bridge->gatt_table_real, agp_bridge->gatt_bus_addr);
+       agp_gatt_table = NULL;
+       agp_bridge->gatt_table = NULL;
+--- linux-2.6.8.1/drivers/char/agp/hp-agp.c    2004-08-14 11:55:59.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/hp-agp.c       2004-09-05 05:55:58.879494644 +0100
+@@ -110,7 +110,7 @@
+       hp->gart_size = HP_ZX1_GART_SIZE;
+       hp->gatt_entries = hp->gart_size / hp->io_page_size;
+-      hp->io_pdir = phys_to_virt(INREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE));
++      hp->io_pdir = bus_to_virt(INREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE));
+       hp->gatt = &hp->io_pdir[HP_ZX1_IOVA_TO_PDIR(hp->gart_base)];
+       if (hp->gatt[0] != HP_ZX1_SBA_IOMMU_COOKIE) {
+@@ -248,7 +248,7 @@
+       agp_bridge->mode = INREG32(hp->lba_regs, hp->lba_cap_offset + PCI_AGP_STATUS);
+       if (hp->io_pdir_owner) {
+-              OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_phys(hp->io_pdir));
++              OUTREG64(hp->ioc_regs, HP_ZX1_PDIR_BASE, virt_to_bus(hp->io_pdir));
+               OUTREG64(hp->ioc_regs, HP_ZX1_TCNFG, hp->io_tlb_ps);
+               OUTREG64(hp->ioc_regs, HP_ZX1_IMASK, ~(HP_ZX1_IOVA_SIZE - 1));
+               OUTREG64(hp->ioc_regs, HP_ZX1_IBASE, hp->iova_base | 0x1);
+--- linux-2.6.8.1/drivers/char/agp/i460-agp.c  2004-08-14 11:55:34.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/i460-agp.c     2004-09-05 05:55:58.879494644 +0100
+@@ -371,7 +371,7 @@
+       }
+       memset(lp->alloced_map, 0, map_size);
+-      lp->paddr = virt_to_phys(lpage);
++      lp->paddr = virt_to_bus(lpage);
+       lp->refcount = 0;
+       atomic_add(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
+       return 0;
+@@ -382,7 +382,7 @@
+       kfree(lp->alloced_map);
+       lp->alloced_map = NULL;
+-      free_pages((unsigned long) phys_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT);
++      free_pages((unsigned long) bus_to_virt(lp->paddr), I460_IO_PAGE_SHIFT - PAGE_SHIFT);
+       atomic_sub(I460_KPAGES_PER_IOPAGE, &agp_bridge->current_memory_agp);
+ }
+--- linux-2.6.8.1/drivers/char/agp/intel-agp.c 2004-08-14 11:55:32.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/intel-agp.c    2004-09-05 05:55:58.880494412 +0100
+@@ -285,7 +285,7 @@
+       if (new == NULL)
+               return NULL;
+-      new->memory[0] = virt_to_phys(addr);
++      new->memory[0] = virt_to_bus(addr);
+       if (pg_count == 4) {
+               /* kludge to get 4 physical pages for ARGB cursor */
+               new->memory[1] = new->memory[0] + PAGE_SIZE;
+@@ -328,10 +328,10 @@
+       agp_free_key(curr->key);
+       if(curr->type == AGP_PHYS_MEMORY) {
+               if (curr->page_count == 4)
+-                      i8xx_destroy_pages(phys_to_virt(curr->memory[0]));
++                      i8xx_destroy_pages(bus_to_virt(curr->memory[0]));
+               else
+                       agp_bridge->driver->agp_destroy_page(
+-                               phys_to_virt(curr->memory[0]));
++                               bus_to_virt(curr->memory[0]));
+               vfree(curr->memory);
+       }
+       kfree(curr);
+--- linux-2.6.8.1/drivers/char/agp/intel-mch-agp.c     2004-08-14 11:54:49.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/intel-mch-agp.c        2004-09-05 05:55:58.880494412 +0100
+@@ -51,7 +51,7 @@
+       if (new == NULL)
+               return NULL;
+-      new->memory[0] = agp_bridge->driver->mask_memory(virt_to_phys(addr), type);
++      new->memory[0] = agp_bridge->driver->mask_memory(virt_to_bus(addr), type);
+       new->page_count = 1;
+       new->num_scratch_pages = 1;
+       new->type = AGP_PHYS_MEMORY;
+@@ -63,7 +63,7 @@
+ {
+       agp_free_key(curr->key);
+       if(curr->type == AGP_PHYS_MEMORY) {
+-              agp_bridge->driver->agp_destroy_page(phys_to_virt(curr->memory[0]));
++              agp_bridge->driver->agp_destroy_page(bus_to_virt(curr->memory[0]));
+               vfree(curr->memory);
+       }
+       kfree(curr);
+--- linux-2.6.8.1/drivers/char/agp/sworks-agp.c        2004-08-14 11:55:10.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/sworks-agp.c   2004-09-05 05:55:58.881494180 +0100
+@@ -51,7 +51,7 @@
+       }
+       SetPageReserved(virt_to_page(page_map->real));
+       global_cache_flush();
+-      page_map->remapped = ioremap_nocache(virt_to_phys(page_map->real), 
++      page_map->remapped = ioremap_nocache(virt_to_bus(page_map->real), 
+                                           PAGE_SIZE);
+       if (page_map->remapped == NULL) {
+               ClearPageReserved(virt_to_page(page_map->real));
+@@ -164,7 +164,7 @@
+       for(i = 0; i < 1024; i++) {
+               serverworks_private.scratch_dir.remapped[i] = (unsigned long) agp_bridge->scratch_page;
+               page_dir.remapped[i] =
+-                      virt_to_phys(serverworks_private.scratch_dir.real);
++                      virt_to_bus(serverworks_private.scratch_dir.real);
+               page_dir.remapped[i] |= 0x00000001;
+       }
+@@ -177,7 +177,7 @@
+       agp_bridge->gatt_table_real = (u32 *)page_dir.real;
+       agp_bridge->gatt_table = (u32 *)page_dir.remapped;
+-      agp_bridge->gatt_bus_addr = virt_to_phys(page_dir.real);
++      agp_bridge->gatt_bus_addr = virt_to_bus(page_dir.real);
+       /* Get the address for the gart region.
+        * This is a bus address even on the alpha, b/c its
+@@ -191,7 +191,7 @@
+       for(i = 0; i < value->num_entries / 1024; i++) {
+               page_dir.remapped[i] =
+-                      virt_to_phys(serverworks_private.gatt_pages[i]->real);
++                      virt_to_bus(serverworks_private.gatt_pages[i]->real);
+               page_dir.remapped[i] |= 0x00000001;
+       }
+--- linux-2.6.8.1/drivers/char/agp/uninorth-agp.c      2004-08-14 11:55:32.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/agp/uninorth-agp.c 2004-09-05 05:55:58.881494180 +0100
+@@ -200,7 +200,7 @@
+       agp_bridge->gatt_table_real = (u32 *) table;
+       agp_bridge->gatt_table = (u32 *)table;
+-      agp_bridge->gatt_bus_addr = virt_to_phys(table);
++      agp_bridge->gatt_bus_addr = virt_to_bus(table);
+       for (i = 0; i < num_entries; i++) {
+               agp_bridge->gatt_table[i] =
diff --git a/linux-2.6.8.1-patches/drm.patch b/linux-2.6.8.1-patches/drm.patch
new file mode 100644 (file)
index 0000000..3412ce6
--- /dev/null
@@ -0,0 +1,11 @@
+--- linux-2.6.8.1/drivers/char/drm/ati_pcigart.h       2004-08-14 11:56:14.000000000 +0100
++++ linux-2.6.8.1-xen0/drivers/char/drm/ati_pcigart.h  2004-09-05 06:14:51.751782846 +0100
+@@ -158,7 +158,7 @@
+       ret = 1;
+ #if defined(__i386__) || defined(__x86_64__)
+-      asm volatile ( "wbinvd" ::: "memory" );
++      wbinvd();
+ #else
+       mb();
+ #endif